# 什么是生成器？
"""
生成器（Generator）是一种特殊的迭代器（Iterator），用于生成一系列的值。
与普通函数不同的是，生成器函数可以使用yield关键字来“产生”一系列的值，
而不是一次性返回所有结果。当生成器函数被调用时，
它并不会立即执行完毕，而是返回一个生成器对象。
这个对象可以在以后的某个时刻通过迭代（例如使用 for 循环）
或调用 next() 方法来获取下一个值。

"""
from collections.abc import Iterable, Iterator

# 创建生成器的两种方式
# 1.列表推导式来创建
lst = [x for x in range(5)]  # 列表推导式

gen = (x for x in range(5))  # 生成器

print(lst, gen)



print(isinstance(gen, Iterable))
print(isinstance(gen, Iterator))


# 2.函数方式来创建
def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a+b

# 这个生成器是无限的

def fib_d(times):
    n = 0
    a, b = 0, 1
    while n < times:
        yield b
        a, b = b, a+b
        n += 1

# 这个生成器是有限的

